import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Properties;

public class Test {
    public static void main(String[] args) throws Exception{
        //创建Properties对象
        Properties properties = new Properties();
        properties.load(new FileReader("C:\\Users\\星星在唱歌\\Desktop\\学习\\LIU\\day23\\a.properties"));
        //获取配置文件中className的值
        String className = properties.getProperty("className");
        System.out.println(className);
        //获取配置文件中method的值
        String method = properties.getProperty("method");
        System.out.println(method);
//        //反射1
//        Class<Emp> empClass = Emp.class;
//        //通过class对象获取类的方法信息
//        Method[] method1 = empClass.getMethods();
//        System.out.println(Arrays.toString(method1));
//
//        反射2
//        Emp emp = new Emp();
//        Class<? extends Emp> aClass1 = emp.getClass();
//        Method[] methods = aClass1.getMethods();
//        System.out.println(Arrays.toString(methods));
        System.out.println("");
        //通过className创建对象
        Class<?> aClass = Class.forName(className);

        //获取类名
        System.out.println(aClass.getName());

        //获取所有的构造器
        Constructor<?>[] constructors = aClass.getConstructors();
        System.out.println("获取所有的构造器  " + Arrays.toString(constructors));

        //获取所有属性的集合(包括私有属性)
        Field[] declaredFields = aClass.getDeclaredFields();
        System.out.println("获取所有属性的集合(包括私有属性)  " +Arrays.toString(declaredFields));

        //获取某个属性（私有的）
        Field name = aClass.getDeclaredField(properties.getProperty("fileTwo"));
        System.out.println("获取某个属性（私有的）  " + name);

        //获取所有的属性（公有的）
        Field[] fields = aClass.getFields();
        System.out.println("获取所有的属性（共有的）  " + Arrays.toString(fields));

        //获取某个属性（公有的）
        Field fileOne = aClass.getField(properties.getProperty("fileOne"));
        System.out.println("获取某个属性（公有的）" + fileOne);

        //创建实例化对象
        Object o = aClass.newInstance();//此处是创建的无参构造
        System.out.println(o);

        //设置属性的值(公有)
        fileOne.set(o,true);
        //获取对象的属性
        //new : 要获取的值对象.get(实例化对象名);
        Object shuxing = fileOne.get(o);
        System.out.println("获取对象的属性" + shuxing);

        //解除私有属性设置的限制
        name.setAccessible(true);
        //设置私有属性得的值
        name.set(o,properties.getProperty("valueTwo"));
        //获取对象属性
        System.out.println("获取对象的私有属性" + name.get(o));

        //获取所有公有方法（包含父类）
        Method[] m1 = aClass.getMethods();
        System.out.println("获取所有公有方法（包含父类）" + Arrays.toString(m1));
        //获取某个公有方法
        Method method1 = aClass.getMethod(properties.getProperty("method"));
        //调用该方法
        method1.invoke(o);

        //获取所有的方法（包括私有，不包括父类）
        Method[] m2 = aClass.getDeclaredMethods();
        System.out.println("获取所有的方法（包括私有，不包括父类）  " +Arrays.toString(m2));
        //获取某个私有方法
        Method method2 = aClass.getDeclaredMethod(properties.getProperty("method1"),int.class,double.class);
        //解除私有方法的限制
        method2.setAccessible(true);
        Object invoke = method2.invoke(o, 50, 100);
        System.out.println("调用该方法，该方法的返回值为：" + invoke);


        //实例化有参构造对象
        //获取有参的构造器
        Constructor<?> constructor = aClass.getConstructor(String.class, int.class);
        //用构造器实例化对象
        Emp ojbk = (Emp) constructor.newInstance("马超", 20);
        ojbk.print();
    }
}
